/*****************************************************************************
* Copyright (c) 2006-2013, Cloudsmith Inc.
* The code, documentation and other materials contained herein have been
* licensed under the Eclipse Public License - v 1.0 by the copyright holder
* listed above, as the Initial Contributor under such license. The text of
* such license is available at www.eclipse.org.
*****************************************************************************/
package org.eclipse.buckminster.ui.actions;
import java.util.List;
import org.eclipse.buckminster.core.cspec.model.CSpec;
import org.eclipse.buckminster.core.metadata.WorkspaceInfo;
import org.eclipse.buckminster.core.metadata.model.Resolution;
import org.eclipse.buckminster.core.version.VersionHelper;
import org.eclipse.buckminster.ui.Messages;
import org.eclipse.buckminster.ui.UiUtils;
import org.eclipse.buckminster.ui.internal.DynamicTableLayout;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
public abstract class AbstractChosenCSpecAction implements IWorkbenchWindowActionDelegate {
static class ComponentLabelProvider extends LabelProvider implements ITableLabelProvider {
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
Resolution cr = (Resolution) element;
String lbl;
switch (columnIndex) {
case 0:
lbl = cr.getRequest().getViewName();
break;
case 1:
lbl = VersionHelper.getHumanReadable(cr.getVersion());
break;
default:
lbl = null;
}
return lbl;
}
}
static class ComponentsDialog extends Dialog {
private final List<Resolution> resolutions;
private Resolution selectedComponent;
private String title;
private TableViewer viewer;
ComponentsDialog(Shell parentShell, String title, List<Resolution> resolutions) {
super(parentShell);
this.title = title;
this.resolutions = resolutions;
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(title);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite superArea = (Composite) super.createDialogArea(parent);
Table table = new Table(superArea, SWT.BORDER | SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
String[] columnNames = new String[] { Messages.name, Messages.version };
int[] columnWeights = new int[] { 70, 30 };
table.setHeaderVisible(true);
DynamicTableLayout layout = new DynamicTableLayout(450);
for (int idx = 0; idx < columnNames.length; idx++) {
TableColumn tableColumn = new TableColumn(table, SWT.LEFT, idx);
tableColumn.setText(columnNames[idx]);
layout.addColumnData(new ColumnWeightData(columnWeights[idx], true));
}
table.setLayout(layout);
table.setSize(450, 450);
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
viewer = new TableViewer(table);
viewer.setLabelProvider(new ComponentLabelProvider());
viewer.setContentProvider(new ArrayContentProvider());
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
getButton(IDialogConstants.OK_ID).setEnabled(selection.size() == 1);
}
});
List<Resolution> input = resolutions.size() > 15 ? resolutions.subList(0, 15) : resolutions;
viewer.setInput(input);
return superArea;
}
@Override
protected void initializeBounds() {
super.initializeBounds();
viewer.setInput(resolutions);
((Table) viewer.getControl()).select(0);
}
@Override
protected void okPressed() {
IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
if (selection.size() == 1) {
selectedComponent = (Resolution) selection.getFirstElement();
super.okPressed();
}
}
Resolution getSelectedComponent() {
return selectedComponent;
}
}
private IWorkbenchWindow window;
@Override
public void dispose() {
}
@Override
public void init(IWorkbenchWindow w) {
window = w;
}
@Override
public void run(IAction action) {
Shell shell = window.getShell();
try {
ComponentsDialog dialog = new ComponentsDialog(shell, Messages.components_known_to_buckminster, WorkspaceInfo.getAllResolutions());
if (dialog.open() != Window.OK)
return;
Resolution cinfo = dialog.getSelectedComponent();
if (cinfo != null)
run(cinfo.getCSpec(), window);
} catch (Exception e) {
UiUtils.openError(shell, Messages.errors_during_loading, e);
}
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
}
protected abstract void run(CSpec cspec, IWorkbenchWindow wbWin);
}